import { callWithNuxt } from "#app";

interface myFetchOptions {
  headers?: Record<string, string>;

  [key: string]: any;
}

const getBaseUrl = () => {
  // 在 Nuxt 中，如果使用相对路径，Nuxt 会自动处理 baseURL
  // 只在需要时才设置 baseURL（例如跨域请求或生产环境的外部服务）
  if (process.env.NODE_ENV === "production") {
    if (process.server) {
      // 服务端使用相对路径，Nuxt 会自动处理
      return undefined;
    } else {
      // 生产环境客户端可能需要完整的域名
      return "http://jbook.xxx.com/";
    }
  } else {
    // 开发环境：服务端和客户端都使用相对路径，Nuxt 会自动处理
    // 只有在特殊情况下（如跨域）才需要设置 baseURL
    return undefined;
  }
};

export const useHttpFetch = (url: string, opt: myFetchOptions) => {
  //token
  const accessToken = useCookie("accessToken");
  //添加请求头和token
  const headers = {
    ...opt.headers,
    ...(accessToken.value
      ? { Authorization: `Bearer ${accessToken.value}` }
      : {}),
  };
  opt.headers = headers;
  const nuxtApp = useNuxtApp();
  const baseUrl = getBaseUrl();
  
  // 在 SSR 时，Nuxt 的 useFetch 会自动处理 cookie
  // 但为了确保在客户端也能正确传递 cookie，我们设置 credentials
  const fetchOptions: any = {
    ...opt,
    // 只在有值时才设置 baseURL，否则让 Nuxt 自动处理相对路径
    ...(baseUrl ? { baseURL: baseUrl } : {}),
    // 在客户端确保 cookie 被包含在请求中（服务端会自动处理）
    ...(process.client ? { credentials: 'include' } : {}),
    onRequestError({ request, options, error }) {
      // Handle the request errors
      console.error("请求错误:", request, error);
    },
    async onResponse({ request, response, options }) {
      // Process the response data
      //自定义处理数据
      // if (response._data.code === 0){
      //    //处理
      //     response._data = response._data.data
      // }else{
      //
      // }
    },
    async onResponseError({ request, response, options }) {
      // Handle the response errors
      //未登录401状态（只在客户端执行跳转）
      if (response.status === 401) {
        // 避免在 SSR 时跳转，只在客户端跳转
        if (process.client) {
          await callWithNuxt(nuxtApp, navigateTo, [
            "/sign_in",
            { replace: true, redirectCode: 401 },
          ]);
        }
      } else if (response.status === 500) {
        console.error("服务器报错！");
      }
    },
  };
  
  return useFetch(url, fetchOptions);
};

//定义接口
export const userInfoFetch = (opt: myFetchOptions) => {
  return useHttpFetch("/user/info", opt);
};
//注册接口
export const registerFetch = (opt: myFetchOptions) => {
  return useHttpFetch("/api/auth/register", opt);
};
//登录接口
export const loginFetch = (opt: myFetchOptions) => {
  return useHttpFetch("/api/auth/login", opt);
};
//文集接口

export const notebookFetch = (opt: myFetchOptions) => {
  return useHttpFetch("/api/note/notebook", opt);
};

//获取文章
export const notesFetch = (opt: myFetchOptions) => {
  return useHttpFetch("/api/note/notes", opt);
};
//新建文章
export const noteFetch = (opt: myFetchOptions) => {
  return useHttpFetch("/api/note/note", opt);
};

//文章图片上传腾讯云
export const cosAuthFetch = (opt: myFetchOptions) => {
  return useHttpFetch("/api/cos/auth", opt);
};

//获取文章列表
export const homeNotesFetch = (opt: myFetchOptions) => {
  return useHttpFetch("/api/home/notes", opt);
};

//获取文章详情
export const noteDetailFetch = (opt: myFetchOptions) => {
  return useHttpFetch("/api/home/detail", opt);
};
//上传头像到腾讯云
export const uploadCosFetch = (opt: myFetchOptions) => {
  return useHttpFetch("/api/uploadCos", opt);
};
//上传文章图片到腾讯云
export const uploadNoteImageFetch = (opt: myFetchOptions) => {
  return useHttpFetch("/api/uploadNoteImage", opt);
};
//修改用户信息
export const editUserFetch = (opt: myFetchOptions) => {
  return useHttpFetch("/api/auth/user", opt);
};
